//
// Created by pangy on 2025/5/11.
//

#ifndef DuLinkList_H
#define DuLinkList_H

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include "Status.h"

typedef int ElemType;

// 结点类型
typedef struct DuLNode {
    ElemType data;
    struct DuLNode* prior;
    struct DuLNode* next;
} DuLNode;

// 链表类型
typedef DuLNode* DuLinkList;

/* 线性表基本操作 链表实现 */


/*---------------------------------链表常规操作------------------------*/
/**
 * 构造一个空的链表 L
 * 成功返回OK,失败返回ERROR
*/
Status InitList(DuLinkList* L);

/**
 * 销毁线性表
 * 成功返回OK, 失败返回ERROR
 * */
Status DestroyList(DuLinkList* L);

/**
 * 清空线性表, 释放原链表的节点空间
 * 成功返回OK,失败返回ERROR
*/
Status ClearList(DuLinkList L);

/**
 * 线性表判空
 * 空表返回TRUE, 否则返回FALSE
 * */
Boolean ListEmpty(DuLinkList L);

/**
 * 线性表长度
 * 返回线性表长度, 空表返回0
 * */
int ListLength(DuLinkList L);

/**
 * 返回链表中第一个满足compare条件的结点
 * @param L 链表
 * @param e 数据元素值
 * @param Compare 比较函数
 * @return 结点
 */
int LocateElem(DuLinkList L, ElemType e, Status (Compare)(ElemType, ElemType));

/**
 * 在指定位置之前插入数据元素
 * @param L 线性表
 * @param i 指定位置
 * @param e 插入数据元素
 * @return OK/ERROR
 */
Status ListInsert(DuLinkList* L, int i, ElemType e);

/**
 * 删除指定位置的数据元素
 * @param L 线性表
 * @param i 位置
 * @param e 删除的数据元素
 * @return OK/ERROR
 */
Status ListDelete(DuLinkList* L, int i, ElemType* e);

/**
 * 线性表数据元素依次操作
 * @param L 线性表
 * @param Visit 操作函数
 */
void ListTraverse(DuLinkList L, void (*visit)(ElemType));

/**
 * 返回指定结点的前驱
 * @param L
 * @param p
 * @return
 */
Status PriorElem(DuLinkList L, ElemType cur_e, ElemType* pre_e);

/**
 * 返回指定结点的后继
 * @param L
 * @param p
 * @return
 */
Status NextPos(DuLinkList L, ElemType cur_e, ElemType* next_e);


/**
 * 获取L中第i个元素的值,赋值到e中
 * @param L
 * @param i
 * @param e
 * @return
 */
Status GetElem(DuLinkList L, int i, ElemType* e);

/**
 * 获取双向链表第i个元素的结点
 * @param L
 * @param i
 * @return
 */
DuLinkList GetElemP(DuLinkList L, int i);


/*---------------------------常用算法-----------------------------------*/

#endif //DuLinkList_H
